using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._OrthoMapping
{
    /// <summary>
    /// <para>Match Control Points</para>
    /// <para>Creates matching tie points for a given ground control point and initial tie point in one of the overlapping images.</para>
    /// <para>在其中一个重叠图像中为给定的地面控制点和初始连接点创建匹配的连接点。</para>
    /// </summary>    
    [DisplayName("Match Control Points")]
    public class MatchControlPoints : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public MatchControlPoints()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_mosaic_dataset">
        /// <para>Input Mosaic Dataset</para>
        /// <para>The mosaic dataset that contains the source imagery from which the tie points will be created.</para>
        /// <para>包含将从中创建连接点的源影像的镶嵌数据集。</para>
        /// </param>
        /// <param name="_in_control_points">
        /// <para>Input Control Points</para>
        /// <para>The input control point set that contains a list of ground control point features and at least one initial tie point for each ground control point.</para>
        /// <para>输入控制点集，其中包含地面控制点要素列表以及每个地面控制点的至少一个初始连接点。</para>
        /// </param>
        /// <param name="_out_control_points">
        /// <para>Output Control Point Table</para>
        /// <para>The output control point features that contain ground control points.</para>
        /// <para>包含地面控制点的输出控制点特征。</para>
        /// </param>
        public MatchControlPoints(object _in_mosaic_dataset, object _in_control_points, object _out_control_points)
        {
            this._in_mosaic_dataset = _in_mosaic_dataset;
            this._in_control_points = _in_control_points;
            this._out_control_points = _out_control_points;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Match Control Points";

        public override string CallName => "management.MatchControlPoints";

        public override List<string> AcceptEnvironments => ["parallelProcessingFactor", "workspace"];

        public override object[] ParameterInfo => [_in_mosaic_dataset, _in_control_points, _out_control_points, _similarity.GetGPValue()];

        /// <summary>
        /// <para>Input Mosaic Dataset</para>
        /// <para>The mosaic dataset that contains the source imagery from which the tie points will be created.</para>
        /// <para>包含将从中创建连接点的源影像的镶嵌数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Mosaic Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_mosaic_dataset { get; set; }


        /// <summary>
        /// <para>Input Control Points</para>
        /// <para>The input control point set that contains a list of ground control point features and at least one initial tie point for each ground control point.</para>
        /// <para>输入控制点集，其中包含地面控制点要素列表以及每个地面控制点的至少一个初始连接点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Control Points")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_control_points { get; set; }


        /// <summary>
        /// <para>Output Control Point Table</para>
        /// <para>The output control point features that contain ground control points.</para>
        /// <para>包含地面控制点的输出控制点特征。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Control Point Table")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_control_points { get; set; }


        /// <summary>
        /// <para>Similarity</para>
        /// <para><xdoc>
        ///   <para>Specifies the similarity level that will be used for matching tie points.</para>
        ///   <bulletList>
        ///     <bullet_item>Low similarity—The similarity criteria for the two matching points will be low. This option will produce the most matching points, but some of the matches may have a higher level of error.</bullet_item><para/>
        ///     <bullet_item>Medium similarity—The similarity criteria for the matching points will be medium.</bullet_item><para/>
        ///     <bullet_item>High similarity—The similarity criteria for the matching points will be high. This option will produce the fewest matching points, but each match will have a lower level of error.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于匹配连接点的相似性级别。</para>
        ///   <bulletList>
        ///     <bullet_item>低相似度—两个匹配点的相似度条件将较低。此选项将生成最多的匹配点，但某些匹配项可能具有更高的误差级别。</bullet_item><para/>
        ///     <bullet_item>中等相似度—匹配点的相似度条件为中等。</bullet_item><para/>
        ///     <bullet_item>高相似度—匹配点的相似性条件将很高。此选项将产生最少的匹配点，但每个匹配的误差级别较低。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Similarity")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _similarity_value _similarity { get; set; } = _similarity_value._HIGH;

        public enum _similarity_value
        {
            /// <summary>
            /// <para>Low similarity</para>
            /// <para>Low similarity—The similarity criteria for the two matching points will be low. This option will produce the most matching points, but some of the matches may have a higher level of error.</para>
            /// <para>低相似度—两个匹配点的相似度条件将较低。此选项将生成最多的匹配点，但某些匹配项可能具有更高的误差级别。</para>
            /// </summary>
            [Description("Low similarity")]
            [GPEnumValue("LOW")]
            _LOW,

            /// <summary>
            /// <para>Medium similarity</para>
            /// <para>Medium similarity—The similarity criteria for the matching points will be medium.</para>
            /// <para>中等相似度—匹配点的相似度条件为中等。</para>
            /// </summary>
            [Description("Medium similarity")]
            [GPEnumValue("MEDIUM")]
            _MEDIUM,

            /// <summary>
            /// <para>High similarity</para>
            /// <para>High similarity—The similarity criteria for the matching points will be high. This option will produce the fewest matching points, but each match will have a lower level of error.</para>
            /// <para>高相似度—匹配点的相似性条件将很高。此选项将产生最少的匹配点，但每个匹配的误差级别较低。</para>
            /// </summary>
            [Description("High similarity")]
            [GPEnumValue("HIGH")]
            _HIGH,

        }

        public MatchControlPoints SetEnv(object parallelProcessingFactor = null, object workspace = null)
        {
            base.SetEnv(parallelProcessingFactor: parallelProcessingFactor, workspace: workspace);
            return this;
        }

    }

}